tf.slice
slice(
input_,
begin,
size,
name=None
)
从张量中提取切片.
此操作从由begin指定位置开始的张量input中提取一个尺寸size的切片.切片size被表示为张量形状,其中size[i]是你想要分割的input的第i维的元素的数量.切片的起始位置(begin)表示为每个input维度的偏移量.换句话说,begin[i]是你想从中分割出来的input的“第i个维度”的偏移量.
begin是基于零的
···
t = tf.constant([[[1, 1, 1], [2, 2, 2]],
[[3, 3, 3], [4, 4, 4]],
[[5, 5, 5], [6, 6, 6]]])
tf.slice(t, [1, 0, 0], [1, 1, 3]) # [[[3, 3, 3]]]
tf.slice(t, [1, 0, 0], [1, 2, 3]) # [[[3, 3, 3],
# [4, 4, 4]]]
tf.slice(t, [1, 0, 0], [2, 1, 3]) # [[[3, 3, 3]],
# [[5, 5, 5]]]
···
shape可以理解为一个数组的维度。[5,5]就是个2维数组,第一维有5个值,第二维有5个值。[5, 5, 1, 32]就是个4维数组,第一维有5个值,第二维有5个值,第三维有1个值,第四维有32个值。数组维度可以理解为[],最外层有5个[],每个[]里还有5个[],以此类推
shape 表示是输出张量的形状 [5,5]应该是大小55的矩阵 [5,5,1,32]这个在卷积网络里应该是卷积核大小55,1个颜色通道,32个不同的卷积核 刚看TensorFlow,
tf.layers.dense(inut,units=k)
tf.layers.dense( input, units=k )会在内部自动生成一个权矩阵kernel和偏移项bias,各变量具体尺寸如下:对于尺寸为[m, n]的二维张量input, tf.layers.dense()会生成:尺寸为[n, k]的权矩阵kernel,和尺寸为[m, k]的偏移项bias。内部的计算过程为y=input * kernel + bias,输出值y的维度为[m, k]。
可以自己构造权重矩阵W和偏移矩阵b,利用矩阵乘法实现全连接层
matmul
两个三维矩阵的乘法怎样计算呢?我通过实验发现,tensorflow把前面的维度当成是batch,对最后两维进行普通的矩阵乘法。也就是说,最后两维之前的维度,都需要相同
tf.shape
根据shape如何变换矩阵。其实简单的想就是,
reshape(t, shape) => reshape(t, [-1]) => reshape(t, shape)
首先将矩阵t变为一维矩阵,然后再对矩阵的形式更改就可以了
|
|
tf.nn.nce_loss
|
|
其中,
train_inputs = tf.placeholder(tf.int32, shape=[batch_size])
train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])
embeddings = tf.Variable(
tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))
embed = tf.nn.embedding_lookup(embeddings, train_inputs)
train_inputs中的就是中心词,train_label中的就是语料库中该中心词在滑动窗口内的上下文词。
所以,train_inputs中会有连续n-1(n为滑动窗口大小)个元素是相同的。即同一中心词。
tf.truncated_normal从截断的正态分布中输出随机值。#生成的值服从具有指定平均值和标准偏差的正态分布,如果生成的值大于平均值2个标准偏差的值则丢弃重新选择。#标准差就是标准偏差,是方差的算术平均根。而上面的代码中对标准方差进行了限制的原因就是为了防止神经网络的参数过大。为什么embeddings中的参数没有进行限制呢?是因为最初初始化的时候,所有的词的词向量之间要保证一定的距离。然后通过学习,才能拉近某些词的关系,使得某些词的词向量更加接近。
l #因为是单层神经网络,所以要限制参数过大。如果是深层神经网络,就不需要标准差除一一个embedding_size的平方根了。深层神经网络虽然也要进行参数的正则化限制,防止过拟合和梯度爆炸问题,但是很少看见,有直接对stddev进行限制的
embddings是词嵌入,就是要学习的词向量的存储矩阵。共有词汇表大小的行数,每一行对应一个词的向量。
在word2vec模型中,我们感兴趣的是为单词构建表示。在训练过程中,给定一个滑动窗口,每个单词将有两个嵌入:1)当单词是中心单词时; 2)当单词是上下文单词时。这两个嵌入分别称为输入和输出向量。(输入和输出矩阵的更多解释)
在我看来,输入矩阵是embeddings和输出矩阵nce_weights
该embeddings张量是最终输出矩阵。它将单词映射到向量。在单词预测图中使用它。
输入矩阵是从训练文本生成的一批centre-word : context-word(train_input和train_label分别)对。
虽然nce_lossop 的确切工作方式还不为我所知,但基本思想是它使用单层网络(参数nce_weights和nce_biases)将输入向量(从embeddings使用embedop中选择)映射到输出字,然后比较输出到训练标签(训练文本中的相邻单词),也输出到词汇中num_sampled所有其他单词的随机子样本(),然后修改输入向量(存储在其中embeddings)和网络参数以最小化错误。
参考文献:理解tensorflow中的`tf.nn.nce_loss()
What is the purpose of weights and biases in tensorflow word2vec example
关于word2vec的skip-gram模型使用负例采样nce_loss损失函数的源码剖析
关于采样编号的问题 编号越大,词频越小
word2vec官网说明
Understanding tf.nn.nce_loss()
in tensorflow
from tensorflow.contrib import learn
vp = learn.preprocessing.VocabularyProcessor(100, 0, tokenizer_fn=chinese_tokenizer)
其中VocabularyProcessor(max_document_length,min_frequency=0,vocabulary=None, tokenizer_fn=None)的构造函数中有4个参数
max_document_length是文档的最大长度。如果文本的长度大于最大长度,那么它会被剪切,反之则用0填充
min_frequency词频的最小值,出现次数>最小词频 的词才会被收录到词表中
vocabulary CategoricalVocabulary 对象,不太清楚使用方法
tokenizer_fn tokenizer function,讲句子或给定文本格式 token化得函数,可以理解为分词函数
链接: https://www.jianshu.com/p/db400a569730
。
维度广播
tf.expand_dims()
tf.squeeze
tf.squeeze(input, axis=None, name=None, squeeze_dims=None)
从tensor中去除形状为1的维。(为了去除多余的维)
tf.concat()
tf.concat(values, axis, name=’concat’)
Concatenates tensors along one dimension.
沿着某维串接tensors。和pandas包的concat方法差不多
例如,有tensor1 “t1”形状为[2,3],tensor2 “t2”形状为[2,3],则
tf.concat([t1,t2],0)的形状为[4,3],tf.concat([t1,t2],1)的形状为[2,6]
tf.trainable_variables(), tf.all_variables(), tf.global_variables()
tf.trainable_variables()
顾名思义,这个函数可以也仅可以查看可训练的变量,在我们生成变量时,无论是使用tf.Variable()还是tf.get_variable()生成变量,都会涉及一个参数trainable,其默认为True。
Tensorflow小技巧整理:tf.trainable_variables(), tf.all_variables(), tf.global_variables()的使用
tf.Variable、tf.get_variable、tf.variable_scope以及tf.name_scope关系
tf.layers.Flatten
展平向量,把一个Tensor 展平
tensorflow官方文档
https://docs.pythontab.com/tensorflow/tutorials/word2vec/
tensorflow性能调优实践
tensorflow里,首字母大写的类,首字母小写的才是op。
tf.constant()是直接定义在graph里的,它是graph的一部分,会随着graph一起加载。如果通过tf.constant()定义了一个维度很高的张量,那么graph占用的内存就会变大,加载也会变慢。而tf.placeholder就没有这个问题,所以如果数据维度很高的话,定义成tf.placeholder是更好的选择
https://www.jianshu.com/p/937a0ce99f56
TensorFlow学习笔记1:graph、session和op
tensorflow 可视化
file_writer = tf.summary.FileWriter(‘/path/to/logs’, sess.graph)
TensorBoard的graph有两种依赖,数据依赖和控制依赖。数据依赖展示了tensors在两个ops之间的流动以及流动方向;控制依赖运用了虚线来表示。TensorBoard显示graph有两个区域,主区域和辅助区域,为了便于观察我们可以把一些高层次的依赖项多的节点从主区域移出到辅助区域,只需要在节点右键点击Remove from main graph即可.
1.创建一个TensorFlow graph,用summary operations来保存我们需要了解的节点的信息。
2.我们需要整合所有节点的信息,如果一个一个提取太耗费精力和时间,我们可以选择tf.summary.merge_all()函数来把所有的op节点整合成一个单一节点,然后通过运行该节点来提取出所有summary op的信息。
3.用tf.summary.FileWriter()函数把提取出的所有的summary op信息存入磁盘中。我们同时可以用该函数把graph的信息存入磁盘,用来可视化神经网络的结构。
4.在训练过程中用add_summary命令把训练信息存入磁盘,训练结束后记得把FileWriter对象close。
打开终端,键入以下命令运行TensorBoard:
tensorboard –logdir=path/to/logs
得到提示信息“Starting TensorBoard…”则运行成功,我们可以打开浏览器,在地址栏输入localhost:6006进入TensorBoard的操作面板。
tensorflow 了解
:池化层(pooling)和全连接层(dense)
tensorflow 1.0 学习:池化层(pooling)和全连接层(dense)
深度学习库 TensorFlow (TF) 中的候选采样
如果类别服从均匀分布,我们就用uniform_candidate_sampler;如果词作类别,我们知道词服从 Zipfian, 我们就用 log_uniform_candidate_sampler; 如果我们能够通过统计或者其他渠道知道类别满足某些分布,我们就用 nn.fixed_unigram_candidate_sampler; 如果我们实在不知道类别分布,我们还可以用 tf.nn.learned_unigram_candidate_sampler。